package com.cheng.example.book.advise151.chap8.client124;

import java.util.concurrent.*;


/**
 *
 * 建议124：异步运算考虑使用Callable接口
 *
 * 这个可以判断线程是否执行完毕
 *
 * 尽可能多的占用系统资源，提供快速运算
 * 可以监控线程的执行情况，比如是否执行完毕、是否有返回值、是否有异常等。
 * 可以为用户提供更好的支持，比如例子中的运算进度等。
 */
//税款计算器
class TaxCalculator implements Callable<Integer> {
    // 本金
    private int seedMoney;

    // 接收主线程提供的参数
    public TaxCalculator(int _seedMoney) {
        seedMoney = _seedMoney;
    }

    @Override
    public Integer call() throws Exception {
        // 复杂计算,运行一次需要2秒
        TimeUnit.MILLISECONDS.sleep(2000);
        return seedMoney / 10;
    }

    public static void main(String[] args) throws InterruptedException,
            ExecutionException {
        // 生成一个单线程的异步执行器
        ExecutorService es = Executors.newSingleThreadExecutor();
        // 线程执行后的期望值
        //Future 未来的事，未来


        //感觉这个非常重要啊
        Future<Integer> future = es.submit(new TaxCalculator(100));
        while (!future.isDone()) { //done完成
            // 还没有运算完成，等待200毫秒
            //micro微秒
            //milli毫秒
            TimeUnit.MICROSECONDS.sleep(20000);
            // 输出进度符号
            System.out.print("*");
        }


        System.out.println("\n计算完成，税金是：" + future.get() + "  元 ");
        es.shutdown();
    }
}